package bremo.main; 

import io.FileWriter_txt;
import io.SimpleTXTFileReader;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.MathContext;
import java.security.InvalidParameterException;

import matLib.ConstantsOptimizer;
import matLib.MatLibBase;
import matLib.Optimizer;
import KivaPostProcessing.KivaPostProcessor;
import berechnungsModule.Berechnung.CanteraCaller;
import bremo.parameter.CasePara;
import bremo.sys.Rechnung;
import bremoExceptions.BirdBrainedProgrammerException;
import bremoExceptions.ParameterFileWrongInputException;
//import bremoswing.SwingBremo;
//import bremoswing.util.FertigMeldungFrame;


/**
 * @author Ngueneko
 * 
 */
public class Bremo extends Thread {

	private  CasePara casePara; //TODO Make me final
	private Rechnung r;
	private File inputFile;
	private boolean caseParaerzeugt=false;
	private boolean calledFromGUI;


	public Bremo( ThreadGroup group , File inputFile) {
		super(group,inputFile.getName());
		calledFromGUI=true;
		this.inputFile=inputFile;	
	}
	

	public Bremo( File inputFile) {	
		super(inputFile.getName());
		this.inputFile=inputFile;	
	}
	
	public Bremo(File inputFile, boolean calledFromGUI) {
		super(inputFile.getName());
		this.inputFile=inputFile;
		this.calledFromGUI=calledFromGUI;	
	}
	

	


	public  Bremo(String absolutePath2InputFile) {
		File fileCP= new File(absolutePath2InputFile);
		Bremo bremo=new Bremo(fileCP,false);
		bremo.run();
		bremo=null;
	}
	

	/**
	 * Erzeugt eine Instanz vom Typ CasePara und startet die Berechnung
	 * @see CasePara
	 */
	public void run() {
		try {
			casePara = new CasePara(inputFile);
			caseParaerzeugt=true;
			//SwingBremo.SetDebbugingMode(casePara.SYS.DUBUGGING_MODE) ; 
			r = new Rechnung(casePara);
		} catch (ParameterFileWrongInputException e) {
			if(calledFromGUI){
			//SwingBremo.setNrOfBremoAlive();
			
//			new FertigMeldungFrame(this.getName(),"<html><u>Thread</u> : Eine Fehler ist in der File <b>"+this.getName()+"</b> aufgetreten !!! <p>" +
//					"\n "+e.getMessage()+"</p></html>", JOptionPane.ERROR_MESSAGE);
//			SwingBremo.StateBremoThread();
		  } 
			e.stopBremo();			
		}
		try {
			r.berechnungDurchfuehren();
			if(calledFromGUI){
//			new FertigMeldungFrame(this.getName(),"Thread "+this.getName()+" ist fertig!",JOptionPane.INFORMATION_MESSAGE);
//			SwingBremo.PutInBremoThreadFertig(this.getName());
			}
		} catch (Exception  e) {
			this.interrupt();
			e.printStackTrace();
		}
		if (calledFromGUI) {
		   //SwingBremo.StateBremoThread();
		    //System.err.println("Rechungszeit:"+(System.currentTimeMillis()-SwingBremo.startTime)+" ms");
		}
	}	

	/**
	 * Gibt ein Objekt vom Typ CasePara zurueck. 
	 * Wenn diese noch nicht erzeugt sind wird ein Fehler ausgegeben. 
	 * @return CasePara
	 * @see CasePara
	 */
	public CasePara get_myCase() {
		if(caseParaerzeugt)
			return casePara;
		else{
			try {
				throw new BirdBrainedProgrammerException("Es wurde versucht auf die Klasse CasePara zuzugreifen. " +
				"Diese wurde aber noch nicht erzeugt. Volldeppprogrammierer");
			} catch (BirdBrainedProgrammerException e) {
				e.stopBremo();
			}			
			return null;
		}
	}

	/**
	 * Gibt an ob eine Instanz vom Typ CasePara bereits erzeugt wurde
	 * @return 
	 * @see CasePara
	 */
	public boolean get_myCaseState () {

		return caseParaerzeugt;
	}
	/**
	 * Gibt die InputFile Von Bremo
	 * @return inpuFile
	 */
	public File get_myFile() {
		
		return inputFile;
	}
}
